package main

import (
	"fmt"
)

func main() {
	// 演示一下管道的使用
	// 1 创建一个可以存放 3 个int类型的管道
	var intChan chan int
	intChan = make(chan int, 3)

	// 2 intChan 实际是一个引用
	fmt.Printf("intChan 的值=%v intChan本身的地址=%p\n", intChan, &intChan)

	// 3 向管道写入数据
	intChan <- 10 // 写入第 1 个数据
	num := 211
	intChan <- num // 写入第 2 个数据
	intChan <- 50  // 写入第 3 个数据
	// 如果从 channel 取出数据后，可以继续放入
	<-intChan     // 表示取出第 1 个数据，并将它抛弃
	intChan <- 98 // 注意点：当我们给管道写入数据时，不能超过其容量，这里还是可以写入的，因为已经抛弃了一个数据

	// 4 管道的长度和cap(容量)
	fmt.Printf("channel len= %v cap=%v \n", len(intChan), cap(intChan)) // 3, 3
	// 5 从管道中读取数据
	var num2 int
	num2 = <-intChan
	fmt.Println("num2=", num2)                                          // 211
	fmt.Printf("channel len= %v cap=%v \n", len(intChan), cap(intChan)) // 2, 3

	// 6 在没有使用协程的情况下，如果我们的管道数据已经全部取出，再取就会报告 deadlock
	num3 := <-intChan // 取出 50
	num4 := <-intChan // 取出 98
	// 已经取完了，再取就报错
	// num5 := <-intChan
	fmt.Println("num3=", num3, "num4=", num4 /*, "num5=", num5*/)
}
